﻿
// TypingDlg.h : 头文件
//

#include "afxwin.h"
#include "atlimage.h"

#include "SocketInterface.h"

#include "HPSocket.h"
#include "ServerHandler.h"
#include "ClientHandler.h"
#include "SearchHandler.h"
#include "Typing.h"

using namespace std;
#define MAX_CACHE 86//缓冲区最多字符数

#pragma once

enum CGameMode {
	STARTPAGE,
	PAUSE,
	SINGLE,
	LAN_SERVER,
	LAN_CLIENT,
	GAMEOVER
};

// CTypingDlg 对话框
class CTypingDlg : public CDialogEx
{
// 构造
public:
	CTypingDlg(CWnd* pParent = NULL);	// 标准构造函数
	~CTypingDlg();

// 对话框数据
	enum { IDD = IDD_TYPING_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CGameMode m_gameMode = STARTPAGE;
	int m_nArtIndex;//当前文章分行到的位置（下行从这个位置下一个）
	CString m_strOneLine;//暂存当前行的字符串
	CString m_strTyping;// 暂存用户输入的缓冲区
	int m_nTyping;// 用户当前一行正确输入的字符个数
	CString m_strArt;// 当前要输入的文章
	float m_nEnemySteps;//敌人行走步数
	float m_nRoleSteps;//角色行走步数

	float m_nEnemySpeed;//敌人速度
	float m_nRoleSpeed;//角色速度（道具加速）
	CImage m_imgMap;//地图图片
	CImage m_imgRole;//主角图片
	CImage m_imgEnemy;//敌人图片
	CImage m_imgStart;//开始界面

	int m_nPngFrame;//行走图中的序号
	const int m_nPngEnemyWidth;//敌人行走图中单位宽度
	const int m_nPngEnemyHeight;//敌人行走图中单位高度
	const int m_nPngRoleWidth;//角色行走图中单位宽度
	const int m_nPngRoleHeight;//角色行走图中单位高度
	CPoint m_roleInPng;//角色行走图中左上角
	CPoint m_enemyInPng;//敌人行走图中左上角

	vector<CPoint> m_routes;//路线节点
	CPoint m_roleStart;//角色起点
	CPoint m_enemyStart;//敌人起点
	int m_roleFaceTo;//角色朝向
	int m_enemyFaceTo;//敌人朝向
	int m_roleCircles;//角色圈数
	int m_enemyCircles;//敌人圈数

	CWnd m_picMap;//地图窗口控件
	CWnd m_picInput;//输入区域窗口控件

	//TCPSERVER
	CTcpServerPtr m_tcpServer;
	CTcpClientPtr m_tcpClient;
	CTcpClientPtr** m_searchClients;//搜索主机的数组
	CString m_hostIp;
	vector<CString> m_foundHost;//已发现的主机列表
	CONNID clientConId;

	//计算角色运动到地图的位置
	CPoint GetXY(int nStep, CPoint& start, int pid);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	afx_msg void OnBnClickedBtnGetart();

	bool InputRight(char c);
	afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
	void InitValues(void);
	void DrawPlayer(int pid, CPoint pt, CDC* p);
	void DrawTextArea(CDC* p);
	void GetHostAddress(CString &strIPAddr);

	// 处理m_strArt，消除空行，保持单词之间空格
	void PreArticle(void);
	// 获得当前要输入参照文章一行，保证最后一个单词完整，如果有标点，标点在最后
	//参数index：从index的下一个开始读取不大于MAX_CAHE
	int GetNowLine(int index);

	void searchLanGame();
	void CreateLanGame();
	void JoinLanGame(CString& address, int& port);
	void handleJoin(CONNID conid);

	void pngTransparent(CImage & img);
	void ImageCopy(CImage* pImgSrc, CImage* pImgDrt);
	CRect getPlayerRect(int pid, int steps);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnClose();
	afx_msg void OnBnClickedButtonCon();
};

struct SearchStruct {
	CTypingDlg* pMain;
	CString host;
};

